package br.gov.ms.tce.modelo.bean;



import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


/**
*  @class Pessoa
 * @author Anderson Paulino
 * @date 27/05/2011
 *
 */
@Entity
@Table( schema = "comum", name = "pessoa")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pessoa implements java.io.Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -4139445025531129995L;
	private Integer id;
	private Character tipo;
	private SituacaoPessoaEnum situacao;
	private Boolean possuiCertificadoDigital;
	private Date dataExpiracaoCertificado;	
	private Set<Telefone> telefones = new HashSet<Telefone>(0);	
	private Set<Endereco> enderecos = new HashSet<Endereco>(0);
	private Set<Email> emails = new HashSet<Email>(0);

	public Pessoa() {
	}

	
	public Pessoa(Character tipo, SituacaoPessoaEnum situacao,
			Boolean possuiCertificadoDigital, Date dataExpiracaoCertificado) {
		
		this.tipo = tipo;
		this.situacao = situacao;
		this.possuiCertificadoDigital = possuiCertificadoDigital;
		this.dataExpiracaoCertificado = dataExpiracaoCertificado;	
		
	}
	public Pessoa(Character tipo, SituacaoPessoaEnum situacao,
			Boolean possuiCertificadoDigital, Date dataExpiracaoCertificado,
			Set<Telefone> telefones,
			Set<Endereco> ctEnderecoses) {
		
		this.tipo = tipo;
		this.situacao = situacao;
		this.possuiCertificadoDigital = possuiCertificadoDigital;
		this.dataExpiracaoCertificado = dataExpiracaoCertificado;		
		this.telefones = telefones;		
		this.enderecos = ctEnderecoses;
	}	
	
	/**
	 * @return Obtém o valor da propriedade id
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "cod", unique = true, nullable = false)
	public Integer getId() {
		return id;
	}


	/**
	 * @param id configura a propriedade id
	 */
	public void setId(Integer id) {
		this.id = id;
	}


	@Column(name = "tipo", length = 1)
	public Character getTipo() {
		return this.tipo;
	}

	public void setTipo(Character tipo) {
		this.tipo = tipo;
	}

	@Column(name = "situacao")
	@Enumerated
	public SituacaoPessoaEnum getSituacao() {
		return this.situacao;
	}

	public void setSituacao(SituacaoPessoaEnum situacao) {
		this.situacao = situacao;
	}

	@Column(name = "possui_certificado_digital")
	public Boolean getPossuiCertificadoDigital() {
		return this.possuiCertificadoDigital;
	}

	public void setPossuiCertificadoDigital(Boolean possuiCertificadoDigital) {
		this.possuiCertificadoDigital = possuiCertificadoDigital;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_expiracao_certificado", length = 23)
	public Date getDataExpiracaoCertificado() {
		return this.dataExpiracaoCertificado;
	}

	public void setDataExpiracaoCertificado(Date dataExpiracaoCertificado) {
		this.dataExpiracaoCertificado = dataExpiracaoCertificado;
	}


	@OneToMany(mappedBy = "pessoa")
	public Set<Telefone> getTelefones() {
		return this.telefones;
	}

	public void setTelefones(Set<Telefone> telefones) {
		this.telefones = telefones;
	}

	@OneToMany(mappedBy = "pessoa")
	public Set<Endereco> getEnderecos() {
		return this.enderecos;
	}

	public void setEnderecos(Set<Endereco> enderecos) {
		this.enderecos = enderecos;
	}


	/**
	 * @return Obtém o valor da propriedade emails
	 */
	@OneToMany(mappedBy = "pessoa")
	public Set<Email> getEmails() {
		return emails;
	}


	/**
	 * @param emails configura a propriedade emails
	 */
	public void setEmails(Set<Email> emails) {
		this.emails = emails;
	}
	
	

}
